﻿/// <reference path="ReportsTreeControl.ascx" />
/// <reference path="ReportViewControl.ascx" />

/****************************************** mehmetakiforakci@gmail.com ****/

// Rapor class'ıdır. diğer usercontrollerde veya code behind 'da propertileri set edilir.
var Report = {
    Id: 0,
    Name: null,
    CategoryName: null,
    ParentId: null,
    FileName: null
}

// Sorguya verilecek parametreleri ve değerlerini içerir. 
// Filter classının propertileri sorgunun parametreleridir. 
// Dinaik olarak eklenen filtre kontrollerinin Change olayları Filter clasının propertylerini set eder.
// Çalıştır butonuna basılınca hazır Filter classı JSON olarak grid_callback ile servera gönderilir ve sorgu server side'da çalıştırılarak grid'e bind edilir.
var Filter = {
    Date: new Date(),
    ReportId: null
}

// Rapor TreeView'de bir rapor tıklatınca query string'e rapor Id'sini ekleyerek sayfayı yeniler
Report.ReportsTreeViewNodeClick = function (s, e) {
    if (e.node.parent) // parent varsa rapordur, kategori değil. Bu durumda query string'e rapor Id'sini ekleyerek sayfayı yeniler
    {
        ReportEditorLoadingPanel.Show();
        document.location = "?rid=" + e.node.name;
    }
    else
        SelectNode();
}

// Seçili raporun TreeView üzerinde de seçili görünmesini sağlar
function SelectNode() {
    // Report.Id ataması ReportViewControl.cs içinde query string'ten alınarak yapılıyor
    var node = ReportsTreeView.GetNodeByName(Report.Id);
    ReportsTreeView.SetSelectedNode(node);
}
/**********************************************************/
//TreeView'de sağ tıklatınca bu function tetiklenerek ASPxPopupMenu açılıyor. Rapor ekleme, silme vs butonları bu menüde
function ReportsTreeMenuInit(s, e) {
    var treeArea = document.getElementById('treeArea');
    ASPxClientUtils.AttachEventToElement(treeArea, 'contextmenu', OnGridContextMenu);
}
// InitPopupMenuHandler için yardımcı
function OnGridContextMenu(evt) {
    ReportsTreeMenu.ShowAtPos(evt.clientX + ASPxClientUtils.GetDocumentScrollLeft(), evt.clientY + ASPxClientUtils.GetDocumentScrollTop());
    return OnPreventContextMenu(evt);
}
//OnGridContextMenu için yardımcı
function OnPreventContextMenu(evt) {
    return ASPxClientUtils.PreventEventAndBubble(evt);
}

/**********************************************************/
//Tree client init olduğunda tüm nodelara event yükler, bu event popup menünün tıklanmasında treeviewde sağ tıklanan raporu bulmak için kullanılacak
function ReportsTreeViewInit(s, e) {
    ProcessNode(s.GetRootNode());
}

//bu da recusive olarak tüm nodelar için çalışır.
function ProcessNode(node) {
    var htmlElement = node.GetHtmlElement();
    var count = node.GetNodeCount();
    if (htmlElement != null) {
        var handler = function (evt) {
            //  cpClickedNode property'si daha sonra tıklanan raporun treeview.node nesnesine ulaşmak için kullanılacak
            ReportsTreeMenu.cpClickedNode = node;
            ReportsTreeMenuItemsVisibility(node.parent == null);
            ReportsTreeMenu.ShowAtElement(node.GetHtmlElement());
            ASPxClientUtils.PreventEventAndBubble(evt);
        };
        ASPxClientUtils.AttachEventToElement(htmlElement, "contextmenu", handler);
    }
    for (var i = 0; i < count; i++)
        ProcessNode(node.GetNode(i));
}

//Treviewde sağ tıklanınca menü açılır. işte bu menü açılırken bu metot çalışır.
function ReportsTreeMenuPopUp(s, e) { }

//Rapor/Kategoriye göre popupu menü butonlarını gizle/göster
function ReportsTreeMenuItemsVisibility(isGroup) {
    ReportsTreeMenu.GetItemByName(ProcessModes.AddReport).SetVisible(isGroup);
    ReportsTreeMenu.GetItemByName(ProcessModes.EditReport).SetVisible(!isGroup);
    ReportsTreeMenu.GetItemByName(ProcessModes.DeleteReport).SetVisible(!isGroup);
    ReportsTreeMenu.GetItemByName(ProcessModes.AddCategory).SetVisible(isGroup);
    ReportsTreeMenu.GetItemByName(ProcessModes.EditCategory).SetVisible(isGroup);
    ReportsTreeMenu.GetItemByName(ProcessModes.DeleteCategory).SetVisible(isGroup);
}

/**********************************************************/

var ProcessModes = {
    None: null,
    AddReport: 0,
    EditReport: 1,
    DeleteReport: 2,
    AddCategory: 3,
    EditCategory: 4,
    DeleteCategory: 5,
    Refresh: 6,
    AddReportResult: 10,
    EditReportResult: 11,
    DeleteReportResult: 12,
    AddCategoryResult: 13,
    EditCategoryResult: 14,
    DeleteCategoryResult: 15

}

var Process = {
    EntityId: 0,
    Mode: ProcessModes.None,
    IsOkay: false,
    Message: null,
    Name: null,
    FileName: null,
    CategoryId: 0,
    FileChanged: false,
    Exception: null
}

// Menüden bir butona tıklatınca..
Report.PopupMenuItemClick = function (s, e) {

    // Sağ klik yapılan rapor/kategori nin tekil id bilgisi
    Process.EntityId = ReportsTreeMenu.cpClickedNode.name;

    SetErrorText(null, null);
    ASPxClientEdit.ClearGroup('ReportEdit');
    ASPxClientEdit.ClearGroup('CategoryEdit');

    if (Process.EntityId < 1)
        return;

    // Report processes
    if (e.item.name == ProcessModes.AddReport) {
        ReportEditorPopUpControl.SetFooterText("Gerekli alanları doldurun, bir .repx dosyası seçin ve kaydedin...");
        lbReportId.SetText('?');
        Process.Mode = ProcessModes.AddReport;
        ControlStates(0);
    }
    else if (e.item.name == ProcessModes.EditReport) {
        ReportEditorPopUpControl.SetFooterText("İstediğiniz bilgileri değiştirin, isterseniz bir rapor dosyası seçin ve kaydedin...");
        lbReportId.SetText(Process.EntityId);
        Process.Mode = ProcessModes.EditReport;
        ControlStates(0);
    }
    else if (e.item.name == ProcessModes.DeleteReport) {
        ReportEditorPopUpControl.SetFooterText("Silinen raporları tekrar geri almak için sistem yöneticinize başvurun.");
        Process.Mode = ProcessModes.DeleteReport;
        ControlStates(2);
    }
        // Category processes
    else if (e.item.name == ProcessModes.AddCategory) {
        ReportEditorPopUpControl.SetFooterText("Kategori adını girerek kaydedin...");
        Process.Mode = ProcessModes.AddCategory;
        ControlStates(1);
    }
    else if (e.item.name == ProcessModes.EditCategory) {
        ReportEditorPopUpControl.SetFooterText("Kategori adını değiştirin ve kaydedin...");
        Process.Mode = ProcessModes.EditCategory;
        ControlStates(1);
    }
    else if (e.item.name == ProcessModes.DeleteCategory) {
        ReportEditorPopUpControl.SetFooterText("Bir kategorinin silinebilmesi için kategori altında herhangi bir aktif rapor bulunmamalıdır.");
        Process.Mode = ProcessModes.DeleteCategory;
        ControlStates(2);
    }

        // ReportEditorPopUpControl.SetContentHTML("Yükleniyor...");
    else if (e.item.name == ProcessModes.Refresh) {
        window.location.reload();
    }

    function ControlStates(ind) {  // 0:report edit, 1:cat edit, 2:delete
        DeletePanel.SetVisible(ind == 2);
        EditPanel.SetVisible(ind == 0);
        CategoryPanel.SetVisible(ind == 1);
        ReportEditorPopUpControl.Show();
        ReportEditorCallback.PerformCallback(JSON.stringify(Process));
    }

}

// Editor açılınca..
ReportEditorPopUpControlPopUp = function (s, e) {
    ReportEditorLoadingPanel.Show();
}

//Editor Popup açıldıktan sonra (Report.PopupMenuItemClick) ve Kaydet butonuna bastıktan sonra (Report.EditorConfirm) yapılan işlem
ReportEditorCallbackComplete = function (s, e) {

    Process = JSON.parse(e.result); // Process.Mode çeşidine göre buna farklı değerler gelir.

    if (Process.Mode == ProcessModes.AddReport) {
        UpdateUploadButton();
        txReportName.SetText(null);
        cbCategories.SetValue(Process.EntityId);
        lbFileName.SetText(null);
    }
    else if (Process.Mode == ProcessModes.EditReport) {
        txReportName.SetText(Process.Name);
        cbCategories.SetValue(Process.CategoryId);
        lbFileName.SetText(Process.FileName);
    }

    else if (Process.Mode == ProcessModes.DeleteReport) {
        DeleteText.SetText(Process.Message);
    }

    else if (Process.Mode == ProcessModes.AddCategory) {
        txNewCategoryName.SetText(null);
    }
    else if (Process.Mode == ProcessModes.EditCategory) {
        txNewCategoryName.SetText(Process.Name);
    }
    else if (Process.Mode == ProcessModes.DeleteCategory) {
        DeleteText.SetText(Process.Message);
    }

        // Report Results        
    else if (Process.Mode == ProcessModes.AddReportResult) {
        ResultAction(ProcessModes.AddReport);
    }
    else if (Process.Mode == ProcessModes.EditReportResult) {
        ResultAction(ProcessModes.EditReport);
    }
    else if (Process.Mode == ProcessModes.DeleteReportResult) {
        ResultAction(ProcessModes.DeleteReport);
    }

        // Category Results
    else if (Process.Mode == ProcessModes.AddCategoryResult) {
        ResultAction(ProcessModes.AddCategory);
    }
    else if (Process.Mode == ProcessModes.EditCategoryResult) {
        ResultAction(ProcessModes.EditCategory);
    }
    else if (Process.Mode == ProcessModes.DeleteCategoryResult) {
        ResultAction(ProcessModes.DeleteCategory);
    }

    ReportEditorLoadingPanel.Hide();
}

function ResultAction(oldMode) {
    if (Process.IsOkay) {
        alert(Process.Message);
        window.location.reload();
    }
    else {
        Process.Mode = oldMode;
        SetErrorText(Process.Message, Process.Exception);
    }
}

function SetErrorText(errMsg, errDetail) {
    if (errMsg == null || errMsg == '') {
        NotifyPanel.SetVisible(false);
        document.getElementById('errorDetail').style.display = 'none';
    }
    else {
        NotifyPanel.SetVisible(true);
        ErrorText.SetText(errMsg);
        ErrorDetail.SetText(errDetail);
    }
}

// Kaydet/Tamam butonuna bastığında...
Report.EditorConfirm = function (s, e) {

    //Gerekli alanların doğruluğunu kontrol et.
    if ((Process.Mode == ProcessModes.AddReport || Process.Mode == ProcessModes.EditReport)
        && !ASPxClientEdit.ValidateGroup("ReportEdit"))
        return;
    if ((Process.Mode == ProcessModes.AddCategory || Process.Mode == ProcessModes.EditCategory)
        && !ASPxClientEdit.ValidateGroup("CategoryEdit"))
        return;

    // Process.EntityId zaten popup açılırken set edilmiş oluyor
    if (Process.Mode == ProcessModes.AddReport) {
        Process.Mode = ProcessModes.AddReportResult;
        Process.Name = txReportName.GetText();
        Process.CategoryId = cbCategories.GetValue();
        upRepxFile.Upload();
    }
    else if (Process.Mode == ProcessModes.EditReport) {
        Process.Mode = ProcessModes.EditReportResult;
        Process.Name = txReportName.GetText();
        Process.CategoryId = cbCategories.GetValue();
        // Yeni dosya seçiliyse...
        if (upRepxFile.GetText(0) != '') {
            Process.FileName = upRepxFile.GetText();
            Process.FileChanged = true;
            upRepxFile.Upload();
        }
        else
            ReportEditorCallback.PerformCallback(JSON.stringify(Process));
    }
    else if (Process.Mode == ProcessModes.DeleteReport) {
        Process.Mode = ProcessModes.DeleteReportResult;
        ReportEditorCallback.PerformCallback(JSON.stringify(Process));
    }

        // Kategori sonuçlarını alacak...
    else if (Process.Mode == ProcessModes.AddCategory) {
        Process.Mode = ProcessModes.AddCategoryResult;
        Process.Name = txNewCategoryName.GetText();
        ReportEditorCallback.PerformCallback(JSON.stringify(Process));
    }
    else if (Process.Mode == ProcessModes.EditCategory) {
        Process.Mode = ProcessModes.EditCategoryResult;
        Process.Name = txNewCategoryName.GetText();
        ReportEditorCallback.PerformCallback(JSON.stringify(Process));
    }
    else if (Process.Mode == ProcessModes.DeleteCategory) {
        Process.Mode = ProcessModes.DeleteCategoryResult;
        ReportEditorCallback.PerformCallback(JSON.stringify(Process));
    }

    ReportEditorLoadingPanel.Show();
}

// İşlemi kaydetmeden iptal ederse , tüm alanları resetle
Report.EditorCancel = function (s, e) {
    Process.EntityId = 0;
    Process.Mode = ProcessModes.None;
    Process.IsOkay = false;
    Process.Message = null;
    Process.Name = null;
    Process.CategoryId = 0;
    Process.FileChanged = false;
    Process.FileName = null;
    Process.Exception = null;
    ReportEditorPopUpControl.Hide();
}

// File Uploader
Report.FileUploaderTextChanged = function (s, e) {
    UpdateUploadButton();
}
function UpdateUploadButton() {
    // btSaveReport.SetEnabled(upRepxFile.GetText(0) != ''); //buna şu an gerek yok, zaten loading panel var, belki lazım olur.
}
Report.FileUploadStart = function (s, e) {
    var fileName;
    if (e.isValid) {
        fileName = e.callbackData;
    }
}
Report.FileUploadComplete = function (s, e) {
    UpdateUploadButton();
    if (e.isValid) {
        Process.FileName = e.callbackData;
        lbFileName.SetText(Process.FileName);
        ReportEditorCallback.PerformCallback(JSON.stringify(Process));
    }
    else {
        UpdateUploadButton();
        ReportEditorLoadingPanel.Hide();
    }

}

